package threaddemo10;

/**
 * Created by L.jp
 * Description:
 * User: 86189
 * Date: 2022-08-06
 * Time: 22:31
 */
//同步代码块解决数据安全问题
    //锁对象使用this
public class MyThread extends Thread{
/*    如果是这样的就表示两个线程使用两把锁，这样是不对的，因为在测试类里实例化了两个实例，
      如果ticket不加static，那么就表示ticket共有200张，我们要的是共享100张
     synchronized(this)表示锁对象是当前线程
*/
//    //定义初始票数
//    private int ticket=100;
//    @Override
//    public void run() {
//        while (true){
//            synchronized (this){
//                //判断，如果票数小于等于0就停止售卖
//                if (ticket <= 0) {
//                    break;
//                } else {
//                    //正常的出票需要时间
//                    try {
//                        Thread.sleep(500);
//                    } catch (InterruptedException e) {
//                        e.printStackTrace();
//                    }
//                    //售票后票数--
//                    ticket--;
//                    //打印窗口还剩多少张、
//                    System.out.println(Thread.currentThread().getName() + "在卖票，还剩" + ticket + "张");
//                }
//            }
//        }
//    }
    
    /*应该是把ticket加上static
    * 锁对象使用同一个object*/
    //定义初始票数
    private static int ticket=100;
    private static Object object=new Object();
    @Override
    public void run() {
        while (true){
            synchronized (object){
                //判断，如果票数小于等于0就停止售卖
                if (ticket <= 0) {
                    break;
                } else {
                    //正常的出票需要时间
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //售票后票数--
                    ticket--;
                    //打印窗口还剩多少张、
                    System.out.println(Thread.currentThread().getName() + "在卖票，还剩" + ticket + "张");
                }
            }
        }
    }
}
